# -*- coding: utf-8 -*-

"""
DateTime   : 2020/12/16 19:21
Author     : ZhangYafei
Description: None
在 Python 中，有一个特殊的常量 None（N 必须大写）。和 False 不同，它不表示 0，也不表示空字符串，而表示没有值，也就是空值。
"""
""" None并不代表空对象，即None和0、 空列表、 空字符串 不同 """
""" None不支持任何运算也没有任何内建方法 """
""" None和任何其他的数据类型比较永远返回False """
print(None == [])  # False
print(None == "")  # False
print(None is [])  # False
print(None is "")  # False

""" None有自己的数据类型NoneType，不能创建其他NoneType对象（它只有一个值None）"""
print(type(None))  # <class 'NoneType'>

# none = NoneType()
# Traceback (most recent call last):
#   File "<input>", line 1, in <module>
# NameError: name 'NoneType' is not defined

""" 在一定程度上可以帮助我们去节省内存。例如： """
v1 = None
v2 = []
v3 = ()
v4 = {}
v5 = set()

from sys import getsizeof

print(getsizeof(v1))  # 16
print(getsizeof(v2))  # 64
print(getsizeof(v3))  # 48
print(getsizeof(v4))  # 240
print(getsizeof(v5))  # 224

""" 
需要注意的是，None 是 NoneType 数据类型的唯一值（其他编程语言可能称这个值为 null、nil 或 undefined），
也就是说，我们不能再创建其它 NoneType 类型的变量，但是可以将 None 赋值给任何变量。如果希望变量中存储的东西不与任何其它值混淆，就可以使用 None。
除此之外，None 常用于 assert、判断以及函数无返回值的情况。举个例子，在前面章节中我们一直使用 print() 函数输出数据，其实该函数的返回值就是 None。因为它的功能是在屏幕上显示文本，根本不需要返回任何值，所以 print() 就返回 None。
"""
print(None == print('hello'))  # True

""" 
另外，对于所有没有 return 语句的函数定义，Python 都会在末尾加上 return None，使用不带值的 return 语句（也就是只有 return 关键字本身），那么就返回 None。
"""
""" 因为None在Python里是个单例对象，一个变量如果是None，它一定和None指向同一个内存地址。 """
a = None
b = None
print(a == b)  # True
print(a is b)  # True

""" is None是判断两个对象在内存中的地址是否一致，== None背后调用的是eq，而eq可以被重载，下面是一个 is not None但 == None的例子： """
class Obj:
    def __eq__(self, other):
        return True

obj = Obj()
print(obj == None)  # True
print(obj is None)  # False

